package visitorPattern

/**
 * 访问者模式:
 * 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作.
 *
 * 角色:
 * 抽象访问者(Visitor):该角色声明一个或多个访问操作,定义访问者可以访问那些元素.
 * 抽象元素(Element):该角色声明一个接收操作,接收一个访问者对象.
 * 具体元素(Concrete Element):该角色实现抽象元素中的接收操作.
 * 结构对象(Object Structure):该角色有以下责任,可以遍历结构中的所有元素,如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素,
 * 也可以设计一个复合对象或者一个集合
 *
 * 主要解决:稳定的数据结构和易变的操作耦合的问题
 * 缺点:破坏了依赖倒置原则,访问者依赖于被访问的对象实体而不是抽象.
 * 何时使用:需要对一个对象结构中的对象进行很多不同的并且不相关的操作.
 *
 * 以下代码,按照各角色定义编写了demo,但是想象不出来有什么使用场景
 */
fun main() {
    //创建一个结构对象
    val objectStructure = ObjectStructure()
    //生成元素
    objectStructure.createElements()
    //创建一个访问者对象
    val visitor = ConcreteVisitor()
    //执行访问
    objectStructure.action(visitor)
}